package upc.condominio.edu.web;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import upc.condominio.edu.beans.BNCuotasPagos;
import upc.condominio.edu.domain.Cuotas;
import upc.condominio.edu.domain.Pagos;

@RequestMapping("/pagos/**")
@Controller
public class PagosController {
/*
    @RequestMapping
    public void get(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    }

    
    @RequestMapping(method = RequestMethod.POST, value = "{id}")
    public void post(@PathVariable Long id, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    }
	*/
    
    @RequestMapping(method = RequestMethod.GET, value = "/pagar/{id}")    
    public String processPagos(@PathVariable Long id, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    	    
    	Cuotas micuota = Cuotas.findCuotas(id);
    	marcaElPago(micuota);
    	return "redirect:/pagos/pagar";
    	
    }    
    
    
    @RequestMapping(method = RequestMethod.GET, value = "/morosos/{id}")    
    public String processMorosos(@PathVariable Long id, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    	    	    	
    	return "redirect:/pagos/morosos";
    }    
    
    /*@RequestMapping
    public String pagos() {
        return "pagos/pagos";
    }*/
    
    
    @RequestMapping
    public String index() {
        return "pagos/index";
    }
    
    @RequestMapping
    public String pagar(org.springframework.ui.ModelMap modelMap) {
    	
    	List<BNCuotasPagos> pagos = new ArrayList<BNCuotasPagos>();
    	List<Cuotas> cuotas = Cuotas.findAllCuotases();
    	
    	List<Pagos> pagoscuotas = Pagos.findAllPagoses();
    	
    	for(Cuotas cuota: cuotas){
    		Pagos objPago = existeCuotaEnPagos(cuota, pagoscuotas);
    		BNCuotasPagos obj = new BNCuotasPagos();
    		
    		if(objPago!=null) 
    			obj= marcoPago(cuota, objPago);    		
    		else
    			obj=noMarcoPago(cuota, objPago);
    		pagos.add(obj);
    	}
    	
    	modelMap.put("pagos", pagos);
    	modelMap.put("date", new Date());
        return "pagos/pagar";
    }    
    
    @RequestMapping
    public String morosos() {
        return "pagos/morosos";
    }
    
    //existe cuota en pagos
    private Pagos existeCuotaEnPagos(Cuotas cuota,
			List<Pagos> lpagos) {
    	Pagos unpago = null;
    	if(!lpagos.isEmpty()){
			for(Pagos obj: lpagos){
				if( obj.getCuota().getId().equals(cuota.getId()) ){
					unpago = obj;
					break;
				}								
			}
    	}
		return unpago;
	}
    
    private BNCuotasPagos marcoPago(Cuotas ocuota, Pagos opago){
    	BNCuotasPagos obj = new BNCuotasPagos();
    	obj.setId(ocuota.getId());
    	obj.setNombres(ocuota.getVivienda().getPropietario().getApellidos()+" "+ocuota.getVivienda().getPropietario().getNombres());
    	obj.setFecVence(ocuota.getFecVencimiento());
    	obj.setFechaPago(opago.getFecPago());
    	obj.setPagado(opago.getPagado());
    	obj.setTipoVivienda(ocuota.getVivienda().getTipoVivienda());
    	obj.setImporte(ocuota.getImporte());
    	obj.setMora("0");
    	return obj;
    }
    
    private BNCuotasPagos noMarcoPago(Cuotas ocuota, Pagos opago){
    	BNCuotasPagos obj = new BNCuotasPagos();
    	obj.setId(ocuota.getId());
    	obj.setNombres(ocuota.getVivienda().getPropietario().getApellidos()+" "+ocuota.getVivienda().getPropietario().getNombres());
    	obj.setFecVence(ocuota.getFecVencimiento());
    	obj.setFechaPago(null);
    	obj.setPagado(false);
    	obj.setTipoVivienda(ocuota.getVivienda().getTipoVivienda());
    	obj.setImporte(ocuota.getImporte());
    	
    	Calendar hoy = Calendar.getInstance();
    	if(hoy.after(ocuota.getFecVencimiento())){
    		obj.setMora("1");
    	}else{
    		obj.setMora("0");
    	}
    	
    	return obj;
    }
    
    private void marcaElPago(Cuotas cuota){
    	Pagos mipago = new Pagos();
    	mipago.setCuota(cuota);
    	Calendar fechaPaga = Calendar.getInstance(TimeZone.getTimeZone("America/Lima"));
    	mipago.setFecPago(fechaPaga);
    	mipago.setPagado(true);
    	mipago.persist();
    }
}
